<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>06-垃圾回收机制</title>
</head>

<body>
    <script>
        /*
            垃圾回收机制：又称为GC机制
                浏览器的一个分线程，会定期自动开始运行工作，主要用来判断哪些对象是垃圾对象，如果对象是垃圾对象，就会将该对象进行回收释放
            回收策略
                引用计数法
                    原理：
                        我们每创建一个对象，对象上都会自动生成一个标识(count)，用来记录对象被引用的次数，初始值为0，
                    如果外部都有该对象地址值引用，count值就会加一，如果外部对该对象的引用断开，count值就会减一
                    垃圾回收机制运行工作的时候，会判断count值是否为0，如果count为0，那就认为该对象是垃圾对象，就会对其回收释放
                    缺点：
                        两个对象里的属性值互相引用，就算外部断开对两个对象的地址值的引用，因为内部属性值的互相引用的原因，不能及时将标识置为0
                        那永远不能被垃圾回收机制给回收，就算是两个对象没有用。

                标记清除法
                    分为两个区域：新生代区和老生代区
                    新生代区
                        分为两个数组：from数组和to数组
                        初始工作：
                            垃圾回收机制会从window对象开始进行全盘扫描，将扫描到的对象放到from数组里
                        继续工作：
                             垃圾回收机制还是从window对象开始进行全盘扫描，扫描到的对象，如果还有外部的地址引用，那就将该对象从from数组移到to数组中，
                             等全盘扫描完，还留在from数组里的对象，就是垃圾对象，垃圾回收机制就回去对其进行回收释放
                             回收释放完，会将from数组和to数组交换位置
                    老生代区
                        老生代区只有一个数组，新生代区的数据在to数组里出现2次或2次以上的数据，就会将其放到老生代区
                        垃圾回收机制进行全盘扫描的时候，如果发现数据还在被引用，那么就对该数组做上标记，等全盘扫描完，没有被标记的对象就是垃圾对象
                        垃圾回收器就会对没有标记的回收释放
                        垃圾回收器就会对没有标记的回收释放完，会再一次进行循环，将所有的标记清除
                缺点：
                    内存存在碎片化
                    垃圾回收器内部已经解决这个问题了，会进行多一次循环进行内存碎片化整理
        */
        // var obj1 = {}
        // var obj2 = obj1;
        // obj1 = null;
        // obj2 = null;
        // console.log(obj2) // null
        // var obj1 = {}
        // var obj2 = {}
        // obj1.a = obj2
        // obj2.a = obj1

        // obj1 = null
        // obj2 = null
        var obj = {
            a: {
                d: {
                    g: {

                    }
                }
            },
            b: {
                e: {
                    h: {

                    }
                }
            },
            c: {
                f: {

                }
            }
        }
    </script>
</body>

</html>